import java.util.Arrays;
import java.util.List;

public class Einsatzplan {

    public static final int MaxFACH = 20;
    public static final int MaxKLASSEN = 12;
    private Fach[] fach;
    private int nFach;
    private Klasse[] klasse;
    private int nKlasse;
    private Einsatz[][] plan;
/**
 * Liest die Daten von Fach und Klasse in die Array ein und
 * erstellt einen neuen Einsatz
 * @param fach
 * @param klasse
 */
    public Einsatzplan(List<Fach> fach, List<Klasse> klasse) {
        this.fach = new Fach[MaxFACH];
        this.klasse = new Klasse[MaxKLASSEN];
        plan = new Einsatz[MaxFACH][MaxKLASSEN];
        nFach = fach.size();
        nKlasse = klasse.size();
        for (int j = 0; j < MaxKLASSEN; ++j) {
            if(j < nKlasse) {
                this.klasse[j] = klasse.get(j);
            } else {
                this.klasse[j] = new Klasse();
            }
        }
        for (int i = 0; i < MaxFACH; ++i) {
            if(i < nFach) {
                this.fach[i] = fach.get(i);
            } else {
                this.fach[i] = new Fach();
            }
            for (int j = 0; j < MaxKLASSEN; ++j) {
                plan[i][j] = new Einsatz();
            }
        }
    }

    /**
     * Gibt den Index der Klasse zurück.
     * @param klasse
     * @return
     */
    private int indexOf(Klasse klasse) {
        for (int i = 0; i < nKlasse; ++i) {
            if (klasse == this.klasse[i]) {
                return i;
            }
        }
        return -1;
    }

    /**
     * Gibt den Index des Faches zurück.
     * @param fach
     * @return
     */
    private int indexOf(Fach fach) {
        for (int i = 0; i < nFach; ++i) {
            if (fach == this.fach[i]) {
                return i;
            }
        }
        return -1;
    }

    public Einsatz getEinsatz(Klasse klasse, Fach fach) {
        int i = indexOf(klasse);
        int j = indexOf(fach);
        if (i < 0 || j < 0) {
            return new Einsatz();
        }
        return plan[i][j];
    }

    /**
     * Legtn den Einsatz des Lehrers fest, in welcher Klasse und in welchem
     * Fach er wie oft unterrichtet.
     * @param klasse
     * @param fach
     * @param einsatz
     */
    public void setEinsatz(Klasse klasse, Fach fach, Einsatz einsatz) {
        for(int i = 1;i<MaxFACH;i++) {
            for(int j = 1;j<MaxKLASSEN;j++) {
                if(this.klasse[j] == klasse && this.fach[i] == fach) {
                plan[i][j] = einsatz;
                }
            }
        }
    }

    /**
     * Gibt eine Liste der Fächer zurück
     * @return
     */
    public List<Fach> getFaecher() {
        List<Fach> faecher = java.util.Arrays.asList(fach).subList(0, nFach);
        return faecher;
    }

    /**
     * Gibt eine Liste der Klassen zurück
     * @return
     */
    public List<Klasse> getKlassen() {
        List<Klasse> klassen = java.util.Arrays.asList(klasse).subList(0, nKlasse);
        return klassen;
    }

    /**
     * Fügt neue Klassen hinzu
     * @param klasse
     */
    public void addKlasse(Klasse klasse) {
        for(int i = 0;i<nKlasse;i++) {
            if(this.klasse[i] == null) {
                this.klasse[i] = klasse;
            }
        }
    }

    /**
     * Entfernt vorhandene Klassen
     * @param klasse
     */
    public void removeKlasse(Klasse klasse) {
        for(int i = 0;i<nKlasse;i++) {
            if(this.klasse[i] == klasse) {
                for(int j = i;j<nKlasse;j++) {
                    this.klasse[j] = this.klasse[j+1];
                }
            }
        }
    }

    /**
     * Fügt neue Fächer hinzu
     * @param fach
     */
    public void addFach(Fach fach) {
        for(int i = 0;i<nFach;i++)  {
            if(this.fach[i] == null) {
                this.fach[i] = fach;
            }
        }
    }

    /**
     * Entfernt vorhandene Fächer
     * @param fach
     */
    public void removeFach(Fach fach) {
        for(int i = 0;i<nFach;i++) {
            if(this.fach[i] == fach) {
                for(int j = i;j<nFach;j++) {
                    this.fach[j] = this.fach[j+1];
                }
            }
        }
    }

    /**
     * Gibt eine Tabelle des Einsatzplanes aus.
     * @return
     */
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        for(int j = 0;j<nKlasse;j++) {
            sb.append(klasse[j]);           
        }
        for(int i = 1;i<nFach;i++) {
            for(int j = 1;j<nKlasse;j++) {
                sb.append(plan[i][j]);
            }

            //sb.append(fach[i]);
        }

        return sb.toString();
    }
}